var createError = require('http-errors');
var express = require('express');
var app = express();
var path = require('path');

//引用session
// var session=require("express-session");
// var cookieParser=require("cookie-parser")

//日志文件
const morgan = require('morgan')
const logger = require('./logger')


var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var myapi = require('./routes/myapi');
var cors = require('cors');

const cookieParser = require('cookie-parser'); //读写cookie
app.use(cookieParser());
//根目录

app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public/uploadcontent')));
//图片浏览目录   xp99.top/imageview/a.jpg  => xp99.top/uploadcontent/a.jpg
// app.use('/js',express.static(path.join(__dirname, 'public/js')));
// app.use('/css',express.static(path.join(__dirname, 'public/css')));
// app.use('/img',express.static(path.join(__dirname, 'public/img')));

var bodyParser = require('body-parser');
app.use(bodyParser.json({
  limit: '50mb'
}));
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true
}));
app.use(cors());
// view engine setup
app.set('views', path.join(__dirname, 'views'));
//app.set('view engine', 'ejs');
//使得模板可以识别HTML文件
app.engine('.html', require('ejs').__express);
app.set('view engine', 'html');

// 引入jwt token工具
var JwtUtil = require('./access/utils/jwt');
//引入上传文件路由
const multerUpload = require('./routes/upload');


app.use(morgan('dev'));
app.use(express.json());
app.use(express.urlencoded({
  extended: false
}));
app.use(cookieParser());






//拦截放最前面
app.use((req, res, next) => {
  const url = req._parsedUrl.pathname; // 获取当前访问的api地址

  // 不需要进行验证的api，白名单   登录 注册时需要用到的
  var urlArr = ['/api/getscroll','/api/getpubkey', '/api/Login', '/api/register', '/api/checkUsername', '/api/phoneused', '/api/calcSMS', '/api/sendSMS', '/upload/single', '/upload'];
  if (urlArr.indexOf(url) >= -1) {
    next()
  } else {
    //需要验证的
    let token = req.headers['authorization']; //小写!!!
    console.log("url", url);
    console.log("token", token);
    if (token == null) {
      res.send({
        status: 403,
        message: '登录已过期,请重新登录' + url
      });
    } else {
      let jwt = new JwtUtil(token);
      let result = jwt.verifyToken();
      console.log("appjs--token", token);
      console.log("appjs--result", result);
      // 如果考验通过就next，否则就返回登陆信息不正确
      if (result == 'err') {

        res.send({
          status: 403,
          message: '登录已过期,请重新登录' + url
        });
        // res.render('login.html');
      } else {
        next();
      }
    }

  }

});



app.use('/api', myapi);

app.use('/upload', multerUpload);


// express中是把session信息存储在内存中
// 配置session
// app.use(session({
//   secret:"dsafsafsf", //设置签名秘钥 内容可以任意填写
//   cookie:{ maxAge:80*1000 }, //设置cookie的过期时间，例：80s后    session和相应的cookie失效过期
//   resave:true, //强制保存，如果session没有被修改也要重新保存
//   saveUninitialized:false //如果原先没有session那么久设置，否则不设置
// }))


// req.session.name='jack'; 
//查看session
// console.log(req.session)
// 删除session
// req.session.destroy();
// res.redirect("http://www.baidu.com"); //删除成功后转到百度页面
// node中的session是将值存储在内存中了，不能直接在浏览器中进行查看；

// 所以将session再写入到cookie中，再浏览器中查看到的就是session存储的时候对应的文件名

// 注意：session中id是关键词，不能在里面存id，跟session中默认的字段冲突



// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
// app.use(function (err, req, res, next) {
//   // set locals, only providing error in development
//   res.locals.message = err.message;
//   res.locals.error = req.app.get('env') === 'development' ? err : {};

//   // render the error page
//   res.status(err.status || 500);
//   res.render('error');
// });


const _errorHandler = (err,req,res,next)=>{
  logger.error(`${req.method} ${req.originalUrl} `+err.message);
  const errorMsg = err.message;
  res.status(err.status || 500).json({
    resultCode: 400,
    message: errorMsg,
  })
}

app.use(_errorHandler)


module.exports = app;